﻿using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using DeferredEvents;
using MasterDetailTemplate.Models;
using SQLite;

namespace MasterDetailTemplate.Services
{
    /// <summary>
    /// 事件存储接口。
    /// By FJH
    /// </summary>
    public interface IEventStorage
    {
        /// <summary>
        /// 初始化事件存储。
        /// </summary>
        Task InitializeAsync();

        /// <summary>
        /// 事件存储是否已经初始化。
        /// </summary>
        bool Initialized();

        /// <summary>
        /// 删除一个事件。
        /// </summary>
        /// <param name="events">事件。</param>
        Task<int> DeleteEventAsync(Event events);

        /// <summary>
        /// 删除所有事件
        /// </summary>
        /// <returns></returns>
        Task DeleteAllEvent();

        /// <summary>
        /// 获取一个事件。
        /// </summary>
        /// <param name="id">事件id。</param>
        Task<Event> GetEventAsync(long id);

        /// <summary>
        /// 获取满足给定条件的事件集合。
        /// </summary>
        /// <param name="where">Where条件。</param>
        /// <param name="skip">跳过数量。</param>
        /// <param name="take">获取数量。</param>
        Task<List<Event>> GetEventsAsync(
            Expression<Func<Event, bool>> where, int skip, int take);

        /// <summary>
        /// 新建或更新一个事件。
        /// </summary>
        /// <param name="events">事件。</param>
        Task SaveEventAsync(Event events);

        /*event EventHandler CountersChanged;*/

        /// <summary>
        /// 事件存储已更新的参数。
        /// </summary>
        event EventHandler<EventStorageUpdatedEventArgs> Updated;

        /// <summary>
        /// 添加一个事件。
        /// </summary>
        /// <param name="events">事件。</param>
        /// <returns></returns>
        Task InsertEventAsync(Event events);

        /// <summary>
        /// 获得所有纪念日。
        /// </summary>
        Task<List<Event>> GetMemoryDaysAsync();

        /// <summary>
        /// 获得所有倒数日。
        /// </summary>
        Task<List<Event>> GetCountdownDaysAsync();

        /// <summary>
        /// 获得所有事件。
        /// </summary>
        Task<List<Event>> GetAllEventsAsync();
    }

    /// <summary>
    /// 事件存储已更新的参数。
    /// </summary>
    public class EventStorageUpdatedEventArgs : DeferredEventArgs
    {
        /// <summary>
        /// 更新的事件。
        /// </summary>
        public Event UpdatedEvent { get; }

        /// <summary>
        /// 事件存储已更新的参数。
        /// </summary>
        /// <param name="eEvent">更新的事件。</param>
        public EventStorageUpdatedEventArgs(Event eEvent)
        {
            UpdatedEvent = eEvent;
        }
    }

}
